/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.jpaControllers;

import Entidades.Localidad;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Provincia;
import Entidades.Proveedor;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Operario;
import Entidades.Transportista;
import logica.jpaControllers.exceptions.IllegalOrphanException;
import logica.jpaControllers.exceptions.NonexistentEntityException;

/**
 *
 * @author Anali
 */
public class LocalidadJpaController {

    public LocalidadJpaController() {
        emf = Persistence.createEntityManagerFactory("GestorPesajeJpaPU2");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Localidad localidad) {
        if (localidad.getProveedorCollection() == null) {
            localidad.setProveedorCollection(new ArrayList<Proveedor>());
        }
        if (localidad.getOperarioCollection() == null) {
            localidad.setOperarioCollection(new ArrayList<Operario>());
        }
        if (localidad.getTransportistaCollection() == null) {
            localidad.setTransportistaCollection(new ArrayList<Transportista>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Provincia provincia = localidad.getProvincia();
            if (provincia != null) {
                provincia = em.getReference(provincia.getClass(), provincia.getIdprovincia());
                localidad.setProvincia(provincia);
            }
            Collection<Proveedor> attachedProveedorCollection = new ArrayList<Proveedor>();
            for (Proveedor proveedorCollectionProveedorToAttach : localidad.getProveedorCollection()) {
                proveedorCollectionProveedorToAttach = em.getReference(proveedorCollectionProveedorToAttach.getClass(), proveedorCollectionProveedorToAttach.getIdProveedor());
                attachedProveedorCollection.add(proveedorCollectionProveedorToAttach);
            }
            localidad.setProveedorCollection(attachedProveedorCollection);
            Collection<Operario> attachedOperarioCollection = new ArrayList<Operario>();
            for (Operario operarioCollectionOperarioToAttach : localidad.getOperarioCollection()) {
                operarioCollectionOperarioToAttach = em.getReference(operarioCollectionOperarioToAttach.getClass(), operarioCollectionOperarioToAttach.getIdoperario());
                attachedOperarioCollection.add(operarioCollectionOperarioToAttach);
            }
            localidad.setOperarioCollection(attachedOperarioCollection);
            Collection<Transportista> attachedTransportistaCollection = new ArrayList<Transportista>();
            for (Transportista transportistaCollectionTransportistaToAttach : localidad.getTransportistaCollection()) {
                transportistaCollectionTransportistaToAttach = em.getReference(transportistaCollectionTransportistaToAttach.getClass(), transportistaCollectionTransportistaToAttach.getIdTransportista());
                attachedTransportistaCollection.add(transportistaCollectionTransportistaToAttach);
            }
            localidad.setTransportistaCollection(attachedTransportistaCollection);
            em.persist(localidad);
            if (provincia != null) {
                provincia.getLocalidadCollection().add(localidad);
                provincia = em.merge(provincia);
            }
            for (Proveedor proveedorCollectionProveedor : localidad.getProveedorCollection()) {
                Localidad oldLocalidadOfProveedorCollectionProveedor = proveedorCollectionProveedor.getLocalidad();
                proveedorCollectionProveedor.setLocalidad(localidad);
                proveedorCollectionProveedor = em.merge(proveedorCollectionProveedor);
                if (oldLocalidadOfProveedorCollectionProveedor != null) {
                    oldLocalidadOfProveedorCollectionProveedor.getProveedorCollection().remove(proveedorCollectionProveedor);
                    oldLocalidadOfProveedorCollectionProveedor = em.merge(oldLocalidadOfProveedorCollectionProveedor);
                }
            }
            for (Operario operarioCollectionOperario : localidad.getOperarioCollection()) {
                Localidad oldLocalidadOfOperarioCollectionOperario = operarioCollectionOperario.getLocalidad();
                operarioCollectionOperario.setLocalidad(localidad);
                operarioCollectionOperario = em.merge(operarioCollectionOperario);
                if (oldLocalidadOfOperarioCollectionOperario != null) {
                    oldLocalidadOfOperarioCollectionOperario.getOperarioCollection().remove(operarioCollectionOperario);
                    oldLocalidadOfOperarioCollectionOperario = em.merge(oldLocalidadOfOperarioCollectionOperario);
                }
            }
            for (Transportista transportistaCollectionTransportista : localidad.getTransportistaCollection()) {
                Localidad oldLocalidadOfTransportistaCollectionTransportista = transportistaCollectionTransportista.getLocalidad();
                transportistaCollectionTransportista.setLocalidad(localidad);
                transportistaCollectionTransportista = em.merge(transportistaCollectionTransportista);
                if (oldLocalidadOfTransportistaCollectionTransportista != null) {
                    oldLocalidadOfTransportistaCollectionTransportista.getTransportistaCollection().remove(transportistaCollectionTransportista);
                    oldLocalidadOfTransportistaCollectionTransportista = em.merge(oldLocalidadOfTransportistaCollectionTransportista);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Localidad localidad) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Localidad persistentLocalidad = em.find(Localidad.class, localidad.getIdlocalidad());
            Provincia provinciaOld = persistentLocalidad.getProvincia();
            Provincia provinciaNew = localidad.getProvincia();
            Collection<Proveedor> proveedorCollectionOld = persistentLocalidad.getProveedorCollection();
            Collection<Proveedor> proveedorCollectionNew = localidad.getProveedorCollection();
            Collection<Operario> operarioCollectionOld = persistentLocalidad.getOperarioCollection();
            Collection<Operario> operarioCollectionNew = localidad.getOperarioCollection();
            Collection<Transportista> transportistaCollectionOld = persistentLocalidad.getTransportistaCollection();
            Collection<Transportista> transportistaCollectionNew = localidad.getTransportistaCollection();
            List<String> illegalOrphanMessages = null;
            for (Proveedor proveedorCollectionOldProveedor : proveedorCollectionOld) {
                if (!proveedorCollectionNew.contains(proveedorCollectionOldProveedor)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Proveedor " + proveedorCollectionOldProveedor + " since its localidad field is not nullable.");
                }
            }
            for (Operario operarioCollectionOldOperario : operarioCollectionOld) {
                if (!operarioCollectionNew.contains(operarioCollectionOldOperario)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Operario " + operarioCollectionOldOperario + " since its localidad field is not nullable.");
                }
            }
            for (Transportista transportistaCollectionOldTransportista : transportistaCollectionOld) {
                if (!transportistaCollectionNew.contains(transportistaCollectionOldTransportista)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Transportista " + transportistaCollectionOldTransportista + " since its localidad field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (provinciaNew != null) {
                provinciaNew = em.getReference(provinciaNew.getClass(), provinciaNew.getIdprovincia());
                localidad.setProvincia(provinciaNew);
            }
            Collection<Proveedor> attachedProveedorCollectionNew = new ArrayList<Proveedor>();
            for (Proveedor proveedorCollectionNewProveedorToAttach : proveedorCollectionNew) {
                proveedorCollectionNewProveedorToAttach = em.getReference(proveedorCollectionNewProveedorToAttach.getClass(), proveedorCollectionNewProveedorToAttach.getIdProveedor());
                attachedProveedorCollectionNew.add(proveedorCollectionNewProveedorToAttach);
            }
            proveedorCollectionNew = attachedProveedorCollectionNew;
            localidad.setProveedorCollection(proveedorCollectionNew);
            Collection<Operario> attachedOperarioCollectionNew = new ArrayList<Operario>();
            for (Operario operarioCollectionNewOperarioToAttach : operarioCollectionNew) {
                operarioCollectionNewOperarioToAttach = em.getReference(operarioCollectionNewOperarioToAttach.getClass(), operarioCollectionNewOperarioToAttach.getIdoperario());
                attachedOperarioCollectionNew.add(operarioCollectionNewOperarioToAttach);
            }
            operarioCollectionNew = attachedOperarioCollectionNew;
            localidad.setOperarioCollection(operarioCollectionNew);
            Collection<Transportista> attachedTransportistaCollectionNew = new ArrayList<Transportista>();
            for (Transportista transportistaCollectionNewTransportistaToAttach : transportistaCollectionNew) {
                transportistaCollectionNewTransportistaToAttach = em.getReference(transportistaCollectionNewTransportistaToAttach.getClass(), transportistaCollectionNewTransportistaToAttach.getIdTransportista());
                attachedTransportistaCollectionNew.add(transportistaCollectionNewTransportistaToAttach);
            }
            transportistaCollectionNew = attachedTransportistaCollectionNew;
            localidad.setTransportistaCollection(transportistaCollectionNew);
            localidad = em.merge(localidad);
            if (provinciaOld != null && !provinciaOld.equals(provinciaNew)) {
                provinciaOld.getLocalidadCollection().remove(localidad);
                provinciaOld = em.merge(provinciaOld);
            }
            if (provinciaNew != null && !provinciaNew.equals(provinciaOld)) {
                provinciaNew.getLocalidadCollection().add(localidad);
                provinciaNew = em.merge(provinciaNew);
            }
            for (Proveedor proveedorCollectionNewProveedor : proveedorCollectionNew) {
                if (!proveedorCollectionOld.contains(proveedorCollectionNewProveedor)) {
                    Localidad oldLocalidadOfProveedorCollectionNewProveedor = proveedorCollectionNewProveedor.getLocalidad();
                    proveedorCollectionNewProveedor.setLocalidad(localidad);
                    proveedorCollectionNewProveedor = em.merge(proveedorCollectionNewProveedor);
                    if (oldLocalidadOfProveedorCollectionNewProveedor != null && !oldLocalidadOfProveedorCollectionNewProveedor.equals(localidad)) {
                        oldLocalidadOfProveedorCollectionNewProveedor.getProveedorCollection().remove(proveedorCollectionNewProveedor);
                        oldLocalidadOfProveedorCollectionNewProveedor = em.merge(oldLocalidadOfProveedorCollectionNewProveedor);
                    }
                }
            }
            for (Operario operarioCollectionNewOperario : operarioCollectionNew) {
                if (!operarioCollectionOld.contains(operarioCollectionNewOperario)) {
                    Localidad oldLocalidadOfOperarioCollectionNewOperario = operarioCollectionNewOperario.getLocalidad();
                    operarioCollectionNewOperario.setLocalidad(localidad);
                    operarioCollectionNewOperario = em.merge(operarioCollectionNewOperario);
                    if (oldLocalidadOfOperarioCollectionNewOperario != null && !oldLocalidadOfOperarioCollectionNewOperario.equals(localidad)) {
                        oldLocalidadOfOperarioCollectionNewOperario.getOperarioCollection().remove(operarioCollectionNewOperario);
                        oldLocalidadOfOperarioCollectionNewOperario = em.merge(oldLocalidadOfOperarioCollectionNewOperario);
                    }
                }
            }
            for (Transportista transportistaCollectionNewTransportista : transportistaCollectionNew) {
                if (!transportistaCollectionOld.contains(transportistaCollectionNewTransportista)) {
                    Localidad oldLocalidadOfTransportistaCollectionNewTransportista = transportistaCollectionNewTransportista.getLocalidad();
                    transportistaCollectionNewTransportista.setLocalidad(localidad);
                    transportistaCollectionNewTransportista = em.merge(transportistaCollectionNewTransportista);
                    if (oldLocalidadOfTransportistaCollectionNewTransportista != null && !oldLocalidadOfTransportistaCollectionNewTransportista.equals(localidad)) {
                        oldLocalidadOfTransportistaCollectionNewTransportista.getTransportistaCollection().remove(transportistaCollectionNewTransportista);
                        oldLocalidadOfTransportistaCollectionNewTransportista = em.merge(oldLocalidadOfTransportistaCollectionNewTransportista);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = localidad.getIdlocalidad();
                if (findLocalidad(id) == null) {
                    throw new NonexistentEntityException("The localidad with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Localidad localidad;
            try {
                localidad = em.getReference(Localidad.class, id);
                localidad.getIdlocalidad();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The localidad with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Proveedor> proveedorCollectionOrphanCheck = localidad.getProveedorCollection();
            for (Proveedor proveedorCollectionOrphanCheckProveedor : proveedorCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Localidad (" + localidad + ") cannot be destroyed since the Proveedor " + proveedorCollectionOrphanCheckProveedor + " in its proveedorCollection field has a non-nullable localidad field.");
            }
            Collection<Operario> operarioCollectionOrphanCheck = localidad.getOperarioCollection();
            for (Operario operarioCollectionOrphanCheckOperario : operarioCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Localidad (" + localidad + ") cannot be destroyed since the Operario " + operarioCollectionOrphanCheckOperario + " in its operarioCollection field has a non-nullable localidad field.");
            }
            Collection<Transportista> transportistaCollectionOrphanCheck = localidad.getTransportistaCollection();
            for (Transportista transportistaCollectionOrphanCheckTransportista : transportistaCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Localidad (" + localidad + ") cannot be destroyed since the Transportista " + transportistaCollectionOrphanCheckTransportista + " in its transportistaCollection field has a non-nullable localidad field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Provincia provincia = localidad.getProvincia();
            if (provincia != null) {
                provincia.getLocalidadCollection().remove(localidad);
                provincia = em.merge(provincia);
            }
            em.remove(localidad);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Localidad> findLocalidadEntities() {
        return findLocalidadEntities(true, -1, -1);
    }

    public List<Localidad> findLocalidadEntities(int maxResults, int firstResult) {
        return findLocalidadEntities(false, maxResults, firstResult);
    }

    private List<Localidad> findLocalidadEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Localidad as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Localidad findLocalidad(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Localidad.class, id);
        } finally {
            em.close();
        }
    }

    public int getLocalidadCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Localidad as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public Localidad findLocalidad_x_nombre(String nom) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select u from Localidad u where u.nombrelocalidad = " + "'" + nom + "'");
            return (Localidad) q.getSingleResult();
        } finally {
            em.close();
        }
    }
}
